package org.xiaojinlong.reading;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author Jin Long
 * 2015/9/17
 */
public class CovariantAndInvariant {
    static class A {}
    static class B extends A {}
    static class C extends B {}
    public static void main(String[] args) {
        // 数组是协变的(covariant) 原因可能是Java最初的设计者们很忙，没有时间详细设计泛型
        // 数组不能有泛型参数 基本类型不能作为泛型参数
        // 要实现array的泛型，必要的步骤就是让array变成non-variant
//        Object[] a = new Long[1];
//        a[0] = "Happy tree friends";
        // 泛型是不可变的(invariant)
        List<? extends A> list = new ArrayList<C>();

        // contravariant 上下边界
        // 拥有泛型的成功的语言中，比如Haskell、ML或Ocaml中，都在使用泛型擦除模式（erasure），所以Scala使用擦除并非只是为了向Java妥协
    }
}
